package middleware

import (
	"RocFamilySystem/models"
	"RocFamilySystem/pkg/constant"
	"RocFamilySystem/tools/cache"
	"github.com/gin-gonic/gin"
	"log"
	"regexp"
	"strings"
)

// WhiteURL 放行URL
var WhiteURL map[string]int

func init() {
	WhiteURL = make(map[string]int)
	WhiteURL["/login"] = 1
	WhiteURL["/register"] = 1
	WhiteURL["/captcha"] = 1
	WhiteURL["/logout"] = 1
}

// HandlePermission 权限验证 必须在程序启动的时候加载角色内容之后
func HandlePermission() gin.HandlerFunc {
	swaggerRegex := regexp.MustCompile("/swagger/.+")
	return func(ctx *gin.Context) {
		uri := ctx.Request.RequestURI
		if _, ok := WhiteURL[uri]; ok || swaggerRegex.MatchString(uri) {
			ctx.Next()
			return
		}
		//去掉携带的query params
		uri = strings.Split(uri, "?")[0]
		//获取方法
		method := ctx.Request.Method
		value, exists := ctx.Get(constant.REQUEST_CONTEXT_LOGIN_USERINFO)
		if !exists {
			log.Panicln("用户未登录！")
			ctx.Abort()
			return
		}

		//获取用户的权限信息
		rolePermissionRegexes, ok := cache.RolePermissionsRegex[*(value.(models.SysUser).Role)]
		if !ok {
			log.Panicln("拒绝访问：没有权限访问！")
			ctx.Abort()
			return
		}

		//匹配权限
		for _, val := range rolePermissionRegexes {
			if !val.Regex.MatchString(uri) {
				continue
			}
			if *val.SysPermission.Method == method {
				//匹配成功
				ctx.Next()
				return
			}
		}

		//没有匹配权限退出
		log.Panicln("拒绝访问：没有权限访问！")
		ctx.Abort()
		return
	}
}
